package com.k12.common.util;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class PageUtil {

    /**
     * 分页结果封装类
     */
    public static class PageResult<T> {
        private List<T> data;          // 当前页数据
        private int currentPage;       // 当前页码
        private int pageSize;          // 每页大小
        private long total;            // 总记录数
        private int totalPages;        // 总页数

        public PageResult(List<T> data, int currentPage, int pageSize, long total) {
            this.data = data;
            this.currentPage = currentPage;
            this.pageSize = pageSize;
            this.total = total;
            this.totalPages = (int) Math.ceil((double) total / pageSize);
        }

        // Getter and Setter
        public List<T> getData() { return data; }
        public int getCurrentPage() { return currentPage; }
        public int getPageSize() { return pageSize; }
        public long getTotal() { return total; }
        public int getTotalPages() { return totalPages; }

        public boolean isFirst() { return currentPage == 1; }
        public boolean isLast() { return currentPage == totalPages; }
        public boolean hasNext() { return !isLast(); }
        public boolean hasPrevious() { return !isFirst(); }
    }

    /**
     * 对列表进行分页处理
     *
     * @param data 原始数据列表
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页结果
     */
    public static <T> PageResult<T> paginate(List<T> data, int page, int size) {
        if (page < 1) page = 1;
        if (size < 1) size = 10;

        int total = data.size();
        int fromIndex = (page - 1) * size;
        int toIndex = Math.min(fromIndex + size, total);

        List<T> pageData = fromIndex < total ? data.subList(fromIndex, toIndex) : List.of();

        return new PageResult<>(pageData, page, size, total);
    }

    /**
     * 带转换函数的分页处理
     *
     * @param data 原始数据列表
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @param converter 转换函数
     * @return 转换后的分页结果
     */
    public static <T, R> PageResult<R> paginate(List<T> data, int page, int size,
                                                Function<T, R> converter) {
        PageResult<T> result = paginate(data, page, size);
        List<R> convertedData = result.getData().stream()
                .map(converter)
                .collect(Collectors.toList());

        return new PageResult<>(convertedData, result.getCurrentPage(),
                result.getPageSize(), result.getTotal());
    }
}
